﻿// 3581. 单词识别.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <map>
#include <string>
#include <algorithm>

using namespace std;
/*
https://www.acwing.com/problem/content/3584/

输入一行英文句子，统计句子中出现的各个单词(不区分大小写)及其出现次数。

要求能识别英文句号和逗号，即是说单词由空格、句号和逗号隔开。

输入格式
共一行，包含一个长度不超过 1000的字符串。

字符串中只包含大小写字母，空格，英文句号和逗号。

输出格式
按字典顺序，输出每个单词及其出现次数。

单词在输出时，应将字母全部转化为小写。

每个单词的输出占一行。

具体格式为：

word:times

数据范围
输入字符串长度不超过 1000。
至少存在一个有效单词，单词一定完全由字母构成。

输入样例：
A blockhouse is a small castle that has four openings through which to shoot.
输出样例：
a:2
blockhouse:1
castle:1
four:1
has:1
is:1
openings:1
shoot:1
small:1
that:1
through:1
to:1
which:1
*/

map<string, int> mm;
string str;

void calc() {
	int l = 0; int r = 0;
	while (l<str.size() && r<str.size()) {
		while (l < str.size() && (str[l] > 'z' || str[l] < 'a')) l++;
		r = l+1;
		if (l >= str.size() && r >= str.size()) break;
		while (r < str.size() && (str[r] <= 'z' && str[r] >= 'a')) r++;
		string curr = str.substr(l, r - l);
		if (curr == "") {
			int debug = 90;
		}
		mm[curr]++;
		l = r + 1;
	}
}

int main()
{

	while (cin >> str) {
		transform(str.begin(), str.end(), str.begin(), ::tolower);
		calc();
	}

	for (auto& e : mm) {
		cout << e.first << ":" << e.second << endl;
	}
	
}

 